﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace XTYAPI.PLC
{
    /// <summary>
    /// 减计数器
    /// WangdDong QQ851879790
    /// 减计数”指令用于递减 CV 参数的值。如果参数 CD 的信号状态从“0”变为“1”（信号上升沿），则执行该指令，同时参数 CV 的当前计数器值减 1。
    /// 每检测到一个信号上升沿，计数器值就会递减 1，直到达到指定数据类型的下限为止。达到下限时，参数 CD 的信号状态将不再影响该指令。
    /// 可以通过参数 Q 查询计数状态。如果当前计数器值小于或等于“0”，则参数 Q 的信号状态将置位为“1”。
    /// 在其它任何情况下，参数 Q 的信号状态均为“0”。也可以为参数 PV 指定一个常数。
    /// 当参数 LD 的信号状态变为“1”时，参数 CV 的值会设置为参数 PV 的值。
    /// 只要参数 LD 的信号状态为“1”，参数 CD 的信号状态就不会影响该指令。
    /// </summary>
    public class CTD
    {
        public CTD()
        {
        }
        public CTD(int pv) : this()
        {
            PV = pv;
        }
        bool cd, ld, last;
        /// <summary>
        /// 溢出
        /// </summary>
        public bool Spill { get; set; } = true;
        /// <summary>
        /// 减数输入
        /// </summary>
        public bool CD
        {
            get
            {
                return cd;
            }
            set
            {
                if (LD) return;
                if (value && !last)
                {
                    if (CV > 0)
                    {
                        CV--;
                    }
                    else
                    {
                        if (Spill)
                        {
                            CV--;
                        }
                        else
                        {
                            CV = 0;
                        }
                    }

                }
                Q = CV <= 0;
                cd = last = value;
            }
        }
        /// <summary>
        /// 置位输出 CV 的目标值
        /// </summary>
        public bool LD
        {
            get { return ld; }
            set
            {
                if (value)
                {
                    CV = PV;
                }
                ld = value;
            }
        }
        /// <summary>
        /// 置位输出 Q 的目标值
        /// </summary>
        public int PV { get; set; }
        /// <summary>
        /// 计数器状态
        /// </summary>
        public bool Q { get { return Q = CV <= 0; } private set { } }
        /// <summary>
        /// 当前计数器值
        /// </summary>
        public int CV { get; private set; }
    }

}
